/* This code is restricted under LGPL license */
using System.Collections.Generic;

namespace infoMECHANICA.NHibernateORM.CriteriaBuilder
{
    /// <summary>
    /// Interface of properties which are convertible to criterions
    /// </summary>
    /// <typeparam name="T">Base property type</typeparam>
    public interface ICriterionPropertyInternal<T>
    {
        /// <summary>
        /// Set "Is between ... and ..." criterion value
        /// </summary>
        /// <param name="beginValue">Begin valueof between range</param>
        /// <param name="endValue">End value of between range</param>
        void SetBetween(T beginValue, T endValue);

        /// <summary>
        /// Set "Is equal..." criterion value
        /// </summary>
        /// <param name="value">Base value</param>
        void SetEq(T value);

        /// <summary>
        /// Set "Is greater than or equal..." criterion value
        /// </summary>
        /// <param name="value">Base value</param>  
        void SetGe(T value);

        /// <summary>
        /// Set "Is greater than..." criterion value
        /// </summary>
        /// <param name="value">Base value</param>  
        void SetGt(T value);

        /// <summary>
        /// Set "Is insensitive like..." criterion value
        /// </summary>
        /// <param name="value">Base value</param>  
        void SetInsentiveLike(T value);

        /// <summary>
        /// Set "Is empty..." criterion value
        /// </summary>
        void SetIsEmpty();

        /// <summary>
        /// Set "Is not empty..." criterion value
        /// </summary>
        void SetIsNotEmpty();

        /// <summary>
        /// Set "Is not null..." criterion value
        /// </summary>
        void SetIsNotNull();

        /// <summary>
        /// Set "Is null..." criterion value
        /// </summary>
        void SetIsNull();

        /// <summary>
        /// Set "Is lower than or equal..." criterion value
        /// </summary>
        /// <param name="value">Base value</param>  
        void SetLe(T value);

        /// <summary>
        /// Set "Is like..." criterion value
        /// </summary>
        /// <param name="value">Base value</param>  
        void SetLike(T value);

        /// <summary>
        /// Set "Is lower than..." criterion value
        /// </summary>
        /// <param name="value">Base value</param>  
        void SetLt(T value);

        /// <summary>
        /// Set "Is not equal..." criterion value
        /// </summary>
        /// <param name="value">Base value</param>  
        void SetNotEq(T value);

        /// <summary>
        /// Set "Is in..." criterion value
        /// </summary>
        /// <param name="values">Base values</param>  
        void SetIn(ICollection<T> values);

        /// <summary>
        /// Set "Is NOT in..." criterion value
        /// </summary>
        /// <param name="values">Base values</param>  
        void SetNotIn(ICollection<T> values);

        /// <summary>
        /// Set "Is equal..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        void SetEq(GenericSubqueryProjection<T> subqueryProjection);

        /// <summary>
        /// Set "All are equal..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        void SetEqAll(GenericSubqueryProjection<T> subqueryProjection);

        /// <summary>
        /// Set "Is greater that or even..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        void SetGe(GenericSubqueryProjection<T> subqueryProjection);

        /// <summary>
        /// Set "All are greater than or even..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        void SetGeAll(GenericSubqueryProjection<T> subqueryProjection);

        /// <summary>
        /// Set "Some are greater or even..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        void SetGeSome(GenericSubqueryProjection<T> subqueryProjection);

        /// <summary>
        /// Set "Is greater than..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        void SetGt(GenericSubqueryProjection<T> subqueryProjection);

        /// <summary>
        /// Set "All are greater than..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        void SetGtAll(GenericSubqueryProjection<T> subqueryProjection);

        /// <summary>
        /// Set "Some are greater than..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        void SetGtSome(GenericSubqueryProjection<T> subqueryProjection);

        /// <summary>
        /// Set "Is in..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        void SetIn(GenericSubqueryProjection<T> subqueryProjection);

        /// <summary>
        /// Set "Is lower than or even..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        void SetLe(GenericSubqueryProjection<T> subqueryProjection);

        /// <summary>
        /// Set "All are lower than or even..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        void SetLeAll(GenericSubqueryProjection<T> subqueryProjection);

        /// <summary>
        /// Set "Some are lower than or even..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        void SetLeSome(GenericSubqueryProjection<T> subqueryProjection);

        /// <summary>
        /// Set "Is lower than..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        void SetLt(GenericSubqueryProjection<T> subqueryProjection);

        /// <summary>
        /// Set "All are lower than..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        void SetLtAll(GenericSubqueryProjection<T> subqueryProjection);

        /// <summary>
        /// Set "Some are lower than..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        void SetLtSome(GenericSubqueryProjection<T> subqueryProjection);

        /// <summary>
        /// Set "Is not equal..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        void SetNe(GenericSubqueryProjection<T> subqueryProjection);

        /// <summary>
        /// Set "Is not in..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        /// <returns></returns>
        void SetNotIn(GenericSubqueryProjection<T> subqueryProjection);

        /// <summary>
        /// Set "Is equal..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        void SetEq(GenericSubqueryProjection<object> subqueryProjection);

        /// <summary>
        /// Set "All are equal..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        void SetEqAll(GenericSubqueryProjection<object> subqueryProjection);

        /// <summary>
        /// Set "Is greater that or even..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        void SetGe(GenericSubqueryProjection<object> subqueryProjection);

        /// <summary>
        /// Set "All are greater than or even..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        void SetGeAll(GenericSubqueryProjection<object> subqueryProjection);

        /// <summary>
        /// Set "Some are greater or even..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        void SetGeSome(GenericSubqueryProjection<object> subqueryProjection);

        /// <summary>
        /// Set "Is greater than..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        void SetGt(GenericSubqueryProjection<object> subqueryProjection);

        /// <summary>
        /// Set "All are greater than..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        void SetGtAll(GenericSubqueryProjection<object> subqueryProjection);

        /// <summary>
        /// Set "Some are greater than..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        void SetGtSome(GenericSubqueryProjection<object> subqueryProjection);

        /// <summary>
        /// Set "Is in..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        void SetIn(GenericSubqueryProjection<object> subqueryProjection);

        /// <summary>
        /// Set "Is lower than or even..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        void SetLe(GenericSubqueryProjection<object> subqueryProjection);

        /// <summary>
        /// Set "All are lower than or even..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        void SetLeAll(GenericSubqueryProjection<object> subqueryProjection);

        /// <summary>
        /// Set "Some are lower than or even..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        void SetLeSome(GenericSubqueryProjection<object> subqueryProjection);

        /// <summary>
        /// Set "Is lower than..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        void SetLt(GenericSubqueryProjection<object> subqueryProjection);

        /// <summary>
        /// Set "All are lower than..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        void SetLtAll(GenericSubqueryProjection<object> subqueryProjection);

        /// <summary>
        /// Set "Some are lower than..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        void SetLtSome(GenericSubqueryProjection<object> subqueryProjection);

        /// <summary>
        /// Set "Is not equal..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        void SetNe(GenericSubqueryProjection<object> subqueryProjection);

        /// <summary>
        /// Set "Is not in..." subquery criterion value
        /// </summary>
        /// <param name="subqueryProjection">Generic-projected detached criteria</param>
        /// <returns></returns>
        void SetNotIn(GenericSubqueryProjection<object> subqueryProjection);  

    }
}
